package com.generator.mybatis.generator.core.service;

import tk.mybatis.mapper.entity.Example;

import java.util.List;


public abstract interface BaseService<T> {
	/**
	 * 根据实体中的属性进行查询，只能有一个返回值，有多个结果是抛出异常，查询条件使用等号
	 * @param t
	 * @return
	 */
	public T selectOne(T t);
	/**
	 * 根据实体中的属性值进行查询，查询条件使用等号
	 * @param t
	 * @return
	 */
	public List<T> select(T t);
	
	public List<T> selectByPage(T t, int page, int pageSize);
	/**
	 * 使用自定义条件查询全部结果
	 * @return
	 */
	public List<T> selectByExample(Example example);
	public List<T> selectByExampleAndRowBounds(Example example, int page, int pageSize);
	/**
	 * 查询全部结果
	 * @return
	 */
	public List<T> selectAll();
	/**
	 * 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
	 * @param key
	 * @return
	 */
	public T selectByPrimaryKey(Object key);
	/**
	 * 根据主键字段进行删除，方法参数必须包含完整的主键属性
	 * @param key
	 * @return
	 */
	public int deleteByPrimaryKey(Object key) throws Exception;
	/**
	 * 根据Example条件删除数据
	 * @param example
	 * @return
	 */
	public int deleteByExample(Object example) throws Exception;
	/**
	 * 保存一个实体，null的属性也会保存，不会使用数据库默认值
	 * @param t
	 * @return
	 */
	public int insert(T t) throws Exception;
	/**
	 * 保存一个实体，null的属性不会保存，会使用数据库默认值
	 * @param t
	 * @return
	 */
	public int insertSelective(T t) throws Exception;
	/**
	 * 根据条件查询总数
	 * @param t
	 * @return
	 */
	public int selectCount(T t);
	public int selectCountByExample(Example example);
	/**
	 * 根据主键更新实体全部字段，null值会被更新
	 * @param t
	 * @return
	 */
	public int updateByPrimaryKey(T t) throws Exception;
	/**
	 * 根据主键更新属性不为null的值
	 * @param t
	 * @return
	 */
	public int updateByPrimaryKeySelective(T t) throws Exception;
	/**
	 * 根据Example条件更新实体`record`包含的全部属性，null值会被更新
	 * @param t
	 * @param example
	 * @return
	 */
	public int updateByExample(T record, Object example) throws Exception;
	/**
	 * 根据Example条件更新实体`record`包含的不是null的属性值
	 * @param record
	 * @param example
	 * @return
	 */
	public int updateByExampleSelective(T record, Object example) throws Exception;
	
}
